const { blog_menus, user_roles, blog_roles, role_menus } = require('@/model');
class MenuService {
  async saveMenu(params) { 
    const [menu] =await blog_menus.upsert(params); // 创建或更新菜单
    return menu;
  }
  async deleteMenu(id) { 
    // 查询子菜单
    const childMenus = await blog_menus.findAll({
      where: {
        parent_id: id
      }
    });

    // 删除子菜单
    if (childMenus.length > 0) {
      const childIds = childMenus.map(menu => menu.id);
      await blog_menus.destroy({
        where: {
          id: childIds
        },
        individualHooks: true // 触发关联钩子
      });
    }

    // 删除菜单
    return await blog_menus.destroy({
      where: {
        id
      },
      individualHooks: true // 触发关联钩子
    });
  }
  async getMenuList(params) { 
    const menuList = await blog_menus.findAll({
    });
    return {
      list: this.buildMenuTree(menuList)
      // list: menuList
    };
  }

  async getUserMenus(user_id) { 
    // 1. 查询用户的所有角色
    const userRoles = await user_roles.findAll({
      where: {
        user_id
      },
      include: [blog_roles]
    });
    if(!userRoles.length) return []; // 用户没有角色 则返回空
    const roleIds = userRoles.map(userRole => userRole.role_id);
    // 2. 获取角色的所有关联菜单（包括按钮）
    const roleMenus = await role_menus.findAll({
      where: {
        role_id: roleIds
      },
      include: [blog_menus]
    });
    const menuIds = roleMenus.map(roleMenu => roleMenu.menu_id);
    if(!menuIds.length) return []; // 角色没有菜单 则返回空
    // 3. 获取菜单 并且构造成树
    const allMenus = await blog_menus.findAll({
      where: {
        id: menuIds
      }
    });
    const menuTree = this.buildMenuTree(allMenus);
    //  const menuTree = this.buildMenuTree(allMenus.filter(m => !m.is_button));
    return menuTree;
  }

  /**
   * 构建菜单树
   */
  buildMenuTree(menus) {
    const menuMap = {};
    const roots = [];

    // 先转成 map
    menus.forEach(menu => {
      menuMap[menu.id] = { ...menu.toJSON(),value:menu.id,label:menu.title, children: [] };
    });

    // 构建树
    menus.forEach(menu => {
      if (menu.parent_id) {
        // 是子菜单，挂载到父菜单下
        if (menuMap[menu.parent_id]) {
          menuMap[menu.parent_id].children.push(menuMap[menu.id]);
        }
      } else {
        // 是根菜单
        roots.push(menuMap[menu.id]);
      }
    });

    return roots;
  }
}

module.exports = new MenuService();